#include "Calendar.h"
#include "stm32f10x_gpio.h"
#include "delay.h"
extern char RecieveBuff[32];
extern char isRecieve;
char schedual=0;
char calendar[3]={0};//时分秒






/************************************************************************
有关于任务转换的测试
利用时间中断从而掉换正在执行的任务这里准备了6个测试样例

问题在于每次调用的时候中断嵌套会发生变化所以这里既要测试转换还要测试转换次数会不会是一个问题


问题在于无法切换死循环的程序所以这里不能用一般的调用方式来进行这个转换


*************************************************************************/
/*void SayHello1(void);
void SayHello2(void);
void SayHello3(void);
void SayHello4(void);
void SayHello5(void);
void SayHello6(void);
void delay()
{
	int i=1000,j=1000;
	for(;j>0;j--)
	{
		for(;i>0;i--);
	}
	
}
						
typedef struct 
{
	void *fun;
}func;

func Function[6]={SayHello1,SayHello2,SayHello3,SayHello4,SayHello5,SayHello6};

*/










//初始化底层
void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
void Calendar_Init(void)
{
	//此处的装配值可能会出问题  TIM3_Int_Init(10000-1,720-1);//1000为1s
	TIM3_Int_Init(10000-1,7200-1);//1000为1s
}
char GetSeconds()
{
	return calendar[2];
}
char GetMintes()
{
	return calendar[1];
}
char GetHours()
{
	return calendar[0];
}
int GetCouter(void)
{
	int couter=0;
	couter=TIM_GetCounter(TIM3);
	return couter;
}


void TIM3_IRQHandler(void)   //TIM3中断
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
		{
			TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
			calendar[2]++;//秒
			printf("%d:%d:%d  0.%ds\n",calendar[0],calendar[1],calendar[2],GetCouter());
			
			if(calendar[2]>=59)
			{
				calendar[2]=0;
				calendar[1]++;//分
				if(calendar[1]>=59)
				{
					calendar[1]=0;
					calendar[0]++;//时
					if(calendar[0]>=23)
					{
						calendar[0]=0;
					}
				}
			}
			//printf("%d:%d:%d  0.%ds\n",calendar[0],calendar[1],calendar[2],GetCouter());
		}
//	if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
//	{	
//			delay_us(1000);
//			for(isRecieve=0;isRecieve<8;isRecieve++)
//			{
//				delay_us(500);
//				RecieveBuff[0]<<=1;
//				if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
//				{
//					p++;
//					RecieveBuff[0]|=0x01;
//				}
//				else
//					RecieveBuff[0]|=0x00;
//				delay_us(500);
//			}
//			if(p%2)
//			{
//				GPIO_SetBits( GPIOA,GPIO_Pin_0);
//			}
//			else
//				GPIO_ResetBits( GPIOA,GPIO_Pin_0);
//	}	
//	TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位		
}




/*
void SayHello1()
{

		printf("This is Sayhello1\n");
		delay();
}

void SayHello2()
{
	while(1)
	{
		printf("This is Sayhello2\n");
		delay();
	}
}

void SayHello3()
{
	
		printf("This is Sayhello3\n");
		delay();
}

void SayHello4()
{

		printf("This is Sayhello4\n");
		delay();

}

void SayHello5()
{

		printf("This is Sayhello5\n");
		delay();
	
}

void SayHello6()
{

		printf("This is Sayhello6\n");
		delay();
}

*/


















